package gestores.administracion;

/*
 *  Estado                                                  Metodo
     P???                                                       listarArticulos
     P???                                                       obtenerDatosArticulo
     P???                                                       insertarFoto
     P??? artCodigo,  Parametro No necesario                      eliminarFoto        Mauri
     P???                                                       insertarDocumento
 *   P??? artCodigo,  Parametro No necesario                     eliminarDocumento   Mauri
 *   P???                                                       modificarArticulo
 *   P???                                                       listarCategoriasSinCategoriasHijas
 */

import dal.ArticuloDAL;

import dal.CategoriaDAL;
import despachador.administracion.Campania;

import excepciones.AvwException;

import java.util.ArrayList;
import java.util.HashMap;

import java.util.logging.Level;
import java.util.logging.Logger;
import negocio.ArticuloAsociado;
import negocio.ArticuloCampania;

import negocio.ArticuloWeb;
import negocio.CampaniaWeb;
import negocio.CategoriaWeb;
import negocio.DestacadoWeb;
import negocio.DocumentoArticuloWeb;
import negocio.FotoArticuloWeb;
import negocio.Marca;

import util.Utiles;


public class GestorArticulo {

    static final Logger logger = Utiles.iniciarLogger("GestorArticulo", true);
    
    /**
     * Constructor
     */
    public GestorArticulo() {
    }
    
    /**
     * Listar los productos
     * @return ArrayList de HashMap con los siguientes datos:
     * artCodigo, artNombre y cawNombre nombre de la categoria web
     */
    public static ArrayList<HashMap> listarArticulos(int opcionFiltro, String filtro, int opcionCampania) throws NullPointerException,
            AvwException {
        ArrayList<HashMap> arr = new ArrayList<HashMap>();
        HashMap hashMap;
        ArrayList<ArticuloWeb> articulosNeg = null;
        
        // Obtengo todos los articulos
        articulosNeg = ArticuloDAL.listarArticulosFiltro(opcionFiltro, filtro, new CampaniaWeb(String.valueOf(opcionCampania)));
        
        // Recorro el array
        for (ArticuloWeb articulo: articulosNeg) {
            hashMap = new HashMap();
            hashMap.put("artCodigo", articulo.getArtCodigo());
            hashMap.put("artNombre", articulo.getArtNombre());
            hashMap.put("artDescripcion", articulo.getArtDescripcion());
            hashMap.put("cawCodigo", articulo.getArwCategoria().getCawCodigo());
            hashMap.put("cawNombre", articulo.getArwCategoria().getCawNombre());
            hashMap.put("marCodigo", articulo.getArtMarcaCodigo().getMarCodigo());
            hashMap.put("marNombre", articulo.getArtMarcaCodigo().getMarNombre());
            hashMap.put("cantidadFotos", articulo.getArwFotos().size());
            hashMap.put("cantidadDocumentos", articulo.getArwDocumentos().size());
            arr.add(hashMap);
        }
        
        if(arr == null){throw new AvwException("Error.");}
        return arr;
    }
    
    /**
     * Listar los productos
     * @return ArrayList de HashMap con los siguientes datos:
     * artCodigo, artNombre y cawNombre nombre de la categoria web
     */
    public static ArrayList<HashMap> listarArticulos(int opcionFiltro, 
            String filtro, String camCodigo, String cawCodigo) throws NullPointerException,
            AvwException {
        ArrayList<HashMap> arr = new ArrayList<HashMap>();
        HashMap hashMap;
        ArrayList<ArticuloWeb> articulosNeg = null;
        
        // Obtengo todos los articulos
        articulosNeg = ArticuloDAL.listarArticulosFiltro(opcionFiltro, filtro,
                new CampaniaWeb(camCodigo), new CategoriaWeb(cawCodigo));
        
        // Recorro el array
        for (ArticuloWeb articulo: articulosNeg) {
            hashMap = new HashMap();
            hashMap.put("artCodigo", articulo.getArtCodigo());
            hashMap.put("artNombre", articulo.getArtNombre());
            hashMap.put("artDescripcion", articulo.getArtDescripcion());
            hashMap.put("cawCodigo", articulo.getArwCategoria().getCawCodigo());
            hashMap.put("cawNombre", articulo.getArwCategoria().getCawNombre());
            hashMap.put("marCodigo", articulo.getArtMarcaCodigo().getMarCodigo());
            hashMap.put("marNombre", articulo.getArtMarcaCodigo().getMarNombre());
            hashMap.put("cantidadFotos", articulo.getArwFotos().size());
            hashMap.put("cantidadDocumentos", articulo.getArwDocumentos().size());
            arr.add(hashMap);
        }
        
        if(arr == null){throw new AvwException("Error.");}
        return arr;
    }

     /**
     * Listar los articulos similares
     * @return ArrayList de HashMap con los siguientes datos:
     * artCodigo, artNombre y cawNombre nombre de la categoria web
     */
    public static ArrayList<HashMap> listarArticulosSimilares(String camCodigo, 
            String artCodigo) throws NullPointerException,AvwException {
        ArrayList<HashMap> arr = new ArrayList<HashMap>();
        HashMap hashMap;
        ArrayList<ArticuloAsociado> articulosRelacionados = null;
        
        
        // Obtengo todos los articulos relacionados 
        articulosRelacionados = ArticuloDAL.listarArticuloCampaniaAsociado(
                new CampaniaWeb(camCodigo),new ArticuloWeb(artCodigo), 1);
        
        // Recorro el array
        for (ArticuloAsociado articulo: articulosRelacionados) {
            hashMap = new HashMap();
            hashMap.put("artCodigo", articulo.getArasArticuloCampania().getArcArticulo().getArtCodigo());
            hashMap.put("artNombre", articulo.getArasArticuloCampania().getArcArticulo().getArtNombre());
            hashMap.put("arasTitulo",articulo.getArasTitulo());
            
            arr.add(hashMap);
        }
        
        if(arr == null){throw new AvwException("Error.");}
        return arr;
    }
    
    /**
     * Listar los articulos relacionados
     * @return ArrayList de HashMap con los siguientes datos:
     * artCodigo, artNombre y cawNombre nombre de la categoria web
     */
    public static ArrayList<HashMap> listarArticulosRelacionados(String camCodigo, 
            String artCodigo) throws NullPointerException,AvwException {
        ArrayList<HashMap> arr = new ArrayList<HashMap>();
        ArrayList<ArticuloAsociado> articulosRelacionados = null;
        
        
        // Obtengo todos los articulos relacionados 
        articulosRelacionados = ArticuloDAL.listarArticuloCampaniaAsociado(
                new CampaniaWeb(camCodigo),new ArticuloWeb(artCodigo), 0);
        
        // Recorro el array
        for (ArticuloAsociado articulo: articulosRelacionados) {
            HashMap hashMap = new HashMap();
            hashMap.put("artCodigo", articulo.getArasArticuloCampania().getArcArticulo().getArtCodigo());
            hashMap.put("artNombre", articulo.getArasArticuloCampania().getArcArticulo().getArtNombre());
            hashMap.put("arasTitulo", articulo.getArasTitulo());
           
            arr.add(hashMap);
        }
        
        if(arr == null){throw new AvwException("Error.");}
        return arr;
    }

    /**
     * Obtiene datos completos de un articulo
     * @param artCodigo codigo del articulo
     * @return HashMap con los siguientes datos:
     * codigo, nombre, palabras claves,
     * codigo y descripcion de las fotos
     * y codigo y descripcion de los documentos del articulo.
     */
    public static HashMap obtenerDatosArticulo(String artCodigo) throws NullPointerException,
            AvwException {
        HashMap articulo = new HashMap();
        ArticuloWeb articuloWeb = new ArticuloWeb();
        ArrayList<HashMap> documentos = new ArrayList<HashMap>();
        ArrayList<HashMap> fotos = new ArrayList<HashMap>();
        
        // Obtengo el objeto articulo a partir del codigo
        
        articuloWeb = ArticuloDAL.obtenerArticuloWebSinCategoria(new ArticuloWeb(artCodigo));
        
        // Cargo los datos del articulo en el HashMap
        articulo.put("artCodigo", articuloWeb.getArtCodigo());
        articulo.put("artNombre", articuloWeb.getArtNombre());
        articulo.put("arwPalabrasClaves", articuloWeb.getArwPalabrasClaves());
        
        articulo.put("cawCodigo", Utiles.noNull(articuloWeb.getArwCategoria().getCawCodigo()));
        articulo.put("cawNombre", Utiles.noNull(articuloWeb.getArwCategoria().getCawNombre()));
        
        articulo.put("marCodigo", Utiles.noNull(articuloWeb.getArtMarcaCodigo().getMarCodigo()));
        articulo.put("marNombre", Utiles.noNull(articuloWeb.getArtMarcaCodigo().getMarNombre()));

        // Cargamos los documentos
        for (DocumentoArticuloWeb documento: articuloWeb.getArwDocumentos()) {
            HashMap documentoHash = new HashMap();
            
            // Cargamos los datos de los documentos
            documentoHash.put("dawCodigo", documento.getDawCodigo());
            documentoHash.put("dawDescripcion", documento.getDawDescripcion());
            
            // Cargamos el documento al array de documentos del articulo
            documentos.add(documentoHash);
        }
        articulo.put("arwDocumentos", documentos);
        
        // Cargamos las fotos
        for (FotoArticuloWeb foto: articuloWeb.getArwFotos()) {
            HashMap fotoHash = new HashMap();
            
            // Cargamos los datos de la foto
            fotoHash.put("fawCodigo", foto.getFawCodigo());
            fotoHash.put("fawDescripcion", foto.getFawDescripcion());
            fotoHash.put("fawNivel", String.valueOf(foto.getFawNivel()));
            
            // Cargamos la foto al array de fotos del articulo
            fotos.add(fotoHash);
        }
        articulo.put("arwFotos", fotos);
        
        if(articulo == null){throw new AvwException("Error.");}
        return articulo;
    }
    
        /**
     * Obtiene datos completos de un articulo campania
     * @param artCodigo codigo del articulo
     * @return HashMap con los siguientes datos:
     * codigo, nombre, palabras claves,
     * codigo y descripcion de las fotos
     * y codigo y descripcion de los documentos del articulo.
     */
    public static HashMap obtenerDatosArticuloCampania(String artCodigo, String camCodigo)
                    throws NullPointerException,AvwException {
        HashMap articulo = new HashMap();
        ArticuloCampania articuloCampania = new ArticuloCampania();
        ArrayList<HashMap> documentos = new ArrayList<HashMap>();
        ArrayList<HashMap> fotos = new ArrayList<HashMap>();
        
        // Obtengo el objeto articulo a partir del codigo
        
        articuloCampania = ArticuloDAL.obtenerArticuloCampaniaAvw(new CampaniaWeb(camCodigo),new ArticuloWeb(artCodigo));
        
        // Cargo los datos del articulo en el HashMap
        articulo.put("artCodigo", articuloCampania.getArcArticulo().getArtCodigo());
        articulo.put("artNombre", articuloCampania.getArcArticulo().getArtNombre());
        
        articulo.put("esMasConsultado", articuloCampania.getArcEsMasConsultado());
        articulo.put("esMasPedido", articuloCampania.getArcEsMasPedido());

        
        
        if(articulo == null){throw new AvwException("Error.");}
        return articulo;
    }
        /**
     * Obtiene datos del destacado
     * @param camCodigo codigo de la campania, 
     * artCodigo codigo del articulo, 
     * nivel es el nivel de destacado,
     * marCodigo codigo de la marca
     * @return HashMap con los siguientes datos:
     *  desTitulo, desDescripcion, desMostrarPrecio.
     */
    public static HashMap obtenerDestacado(String camCodigo, String artCodigo, 
            String nivel) throws NullPointerException,AvwException {
        
        HashMap destacadoHash = new HashMap();
        ArticuloWeb articuloWeb = new ArticuloWeb(artCodigo);
        // Obtengo el objeto destacado partir del codigo de campania, el codigo del 
        //articulo el nivel y el codigo de la marca
        CampaniaWeb campaniaWeb = new CampaniaWeb(camCodigo);
        DestacadoWeb destacado = new DestacadoWeb();
        destacado = ArticuloDAL.obtenerArticuloDestacado(
                campaniaWeb,articuloWeb,nivel);
        
        // Cargo los datos del destacado en el HashMap
        destacadoHash.put("desTitulo", destacado.getDesTitulo());
        destacadoHash.put("desDescripcion", destacado.getDesDescripcion());
        destacadoHash.put("desMostrarPrecio", destacado.getDesMostrarPrecio());
        
        return destacadoHash;
    }
    
    /**
     * Registra una foto
     * @param artCodigo codigo del articulo
     * @param fotDescripcion descripcion de la foto
     */
    public static String insertarFoto(String artCodigo, String fotDescripcion) {
        String codigo = "";
        try {
            FotoArticuloWeb foto = new FotoArticuloWeb();
            foto.setFawDescripcion(fotDescripcion);
            codigo = ArticuloDAL.insertarFoto(new ArticuloWeb(artCodigo),foto);
        } catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }
        return codigo;
    }
    
    /**
     * Elimina una foto
     * @param fotCodigo codigo de la foto que se desea eliminar
     */
    public static void eliminarFoto(String fotCodigo) {
        FotoArticuloWeb fw = new FotoArticuloWeb();
        fw.setFawCodigo(fotCodigo);
        try {
            ArticuloDAL.eliminarFoto(fw);
        } catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }
        
    }
    
    /**
     * Registra un nuevo documento
     * @param artCodigo
     * @param docDescripcion
     */
    public static String insertarDocumento(String artCodigo, String docDescripcion) {
        
        DocumentoArticuloWeb dw = new DocumentoArticuloWeb();
        dw.setDawDescripcion(docDescripcion);
        String codigo = "";
        
        try {
            codigo = ArticuloDAL.insertarDocumento(dw, new ArticuloWeb(artCodigo));
        } catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }
        
        return codigo;
    }
    
    /**
     * Eliminar un documento
     * @param dawCodigo codigo del documento
     */
    public static void eliminarDocumento(String dawCodigo) {
        DocumentoArticuloWeb dw = new DocumentoArticuloWeb();
        dw.setDawCodigo(dawCodigo);
        try {
            ArticuloDAL.eliminarDocumento(dw);
        } catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }
    }
    
    /**
     * Guarda los datos del articulo para la pagina web
     * @param artCodigo codigo del articulo
     * @param arwPalabrasClaves palabras claves del articulo
     * @param cawCodigo codigo de la categoria web del articulo
     */
    public static void guardarArticulo(String artCodigo, String arwPalabrasClaves,
            String cawCodigo) {
        ArticuloWeb aw = new ArticuloWeb();
        CategoriaWeb cw = new CategoriaWeb();
        if (arwPalabrasClaves == null){
            try {
                aw = ArticuloDAL.obtenerArticuloWeb(new ArticuloWeb(artCodigo));
            } catch (AvwException ex) {
                ex.printStackTrace();
            }
        } else{
            aw.setArwPalabrasClaves(arwPalabrasClaves);
        }
        aw.setArtCodigo(artCodigo);
        
        if (cawCodigo == null){
            try {
                cw = aw.getArwCategoria();
            } catch (AvwException ex) {
                ex.printStackTrace();
            }
        } else{
            cw.setCawCodigo(cawCodigo);
        }
        aw.setArwCategoria(cw);
        try {
            if (ArticuloDAL.verificarExistencia(aw)){
                ArticuloDAL.modificarArticulo(aw);
            } else{
                ArticuloDAL.insertarArticuloCategoria(aw);
            }
        } catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }
        
    }
    
    /**
     * Lista las categorias que no poseen categorias hijas
     * @return ArrayList de HashMap con los siguientes datos:
     * codigo y nombre de la categoria web.
     */
    public static ArrayList listarCategoriasSinCategoriasHijas() throws NullPointerException {
        ArrayList<HashMap> categorias = new ArrayList<HashMap>();
        ArrayList<CategoriaWeb> categoriasSinHijas =
                new ArrayList<CategoriaWeb>();
        HashMap categoriaHash = new HashMap();
        try {
            categoriasSinHijas = CategoriaDAL.listarCategoriasSinCategoriasHijas();
            // Recorro el array
            for (CategoriaWeb categoria: categoriasSinHijas) {
                categoriaHash = new HashMap();
                categoriaHash.put("cawCodigo", categoria.getCawCodigo());
                categoriaHash.put("cawNombre", categoria.getCawNombre());
                categoriaHash.put("cawPalabrasClaves",
                        categoria.getCawPalabrasClaves());
                categorias.add(categoriaHash);
            }
        } catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }
        
        return categorias;
    }
    
    /**
     * Modifica el nivel de la foto pasada por parametro.
     * @param fawCodigo, codigo de la foto a modificar.
     * @param nivel, si es = 1 es Primaria.
     **/    
    public static void ModificarNivelFoto(String fawCodigo, String nivel, String artCodigo) throws AvwException {
        FotoArticuloWeb fotoArticuloWeb = new FotoArticuloWeb(fawCodigo);
        fotoArticuloWeb.setFawNivel(Integer.parseInt(nivel));
        ArticuloDAL.ModificarNivelFoto(fotoArticuloWeb, artCodigo);
    }
    
}